/*
 * Copyright (c) 2023, 2023,yzc.cn All rights reserved.
 *
 */
package cn.yzc;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * <p>Project: RabbitMQ - PubConsumer</p>
 * <p>Powered by yzc On 2023-12-19 17:18:34</p>
 * <p>描述：<p>
 *
 * @author yzc [yzc0415@126.com]
 * @version 1.0
 * @since 17
 */
public class PubConsumer {
    public static void main(String[] args) throws IOException,  TimeoutException {
        //1. 创建连接工厂
        ConnectionFactory factory=new ConnectionFactory();
        //设置虚拟机名称
        factory.setVirtualHost("/");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("1357");
        //设置端口号
        factory.setPort(5673);
        //mq服务器地址
        factory.setHost("127.0.0.1");

        //2. 创建连接
        Connection conn=factory.newConnection();

        //3. 创建信道
        Channel channel=conn.createChannel();

        //4.声明队列
        String queueName="queueTwo";//队列的名称
        /**
         * @Param   queue   队列的名称
         * @Param  durable 指队列是否持久化 ，如果为false，mq服务器停止或重启时  队列会丢失
         * @Param exclusive  是否是独占连接  如果设置为true，那么生产者和消费者必须是同一个连接对象
         * @Param autoDelete 是否自动删除  如果队列没有消息 是否自动删除队列
         * @Param arguments 队列中的参数
         */
        channel.queueDeclare(queueName,true,true,false,null);

        //5.向队列发送消息
        String msg="hello world!SSSSSSS";
        /**
         * @Param exchnage 交换机 这里是simple 简单工作模式  设置为""
         * @Param 路由键  用来说明消息发送到哪个队列上  在这里指定队列的名称
         * @Param props 发送消息传递的属性
         * @Param body消息内容
         */
        channel.basicPublish("",queueName,null,msg.getBytes());


        //因为队列是独占连接   消费者必须是同一个连接上的 才能消费
        //声明消费者
        channel.queueDeclare(queueName,true,true,false,null);
        //消息投递回调
        DeliverCallback deliverCallback=(consumerTag, message)->{
            System.out.println(consumerTag);
            //从mq中获取到的消息
            String msgs=new String(message.getBody());
            System.out.println("独占消费消息:"+msgs);
        };
        //5.消费消息
        channel.basicConsume(queueName,true,deliverCallback,consumerTag->{});


        //6. 关闭连接  释放资源
        conn.close();

        System.out.println("消息发送完毕。。。");

    }
}
